import xml.etree.ElementTree as ET
import json
import math
import random


def generate_random_lat_lon(center_lat, center_lon, radius_km, decimal_places=7):
    """
    在给定的中心点经纬度及半径范围内生成随机的经纬度坐标，并限制经纬度的小数位数。

    参数:
    center_lat (float): 中心点的纬度
    center_lon (float): 中心点的经度
    radius_km (float): 范围半径，单位为千米
    decimal_places (int): 经纬度保留的小数位数，默认值为7

    返回:
    tuple: 包含随机生成且限制了小数位数的纬度和经度的元组 (random_lat, random_lon)
    """
    # 地球半径，单位千米
    earth_radius_km = 6371.0

    # 将角度转换为弧度
    center_lat_rad = math.radians(center_lat)
    center_lon_rad = math.radians(center_lon)

    # 随机生成一个在半径范围内的距离（单位千米）
    random_distance = random.uniform(0, radius_km)

    # 随机生成一个方向角度（单位弧度）
    random_angle = random.uniform(0, 2 * math.pi)

    # 根据距离和角度计算纬度变化量（单位弧度）
    lat_change_rad = random_distance / earth_radius_km
    # 根据距离、角度以及中心点纬度计算经度变化量（单位弧度）
    lon_change_rad = random_distance / (earth_radius_km * math.cos(center_lat_rad))

    # 计算随机的纬度（单位弧度），再转换回角度
    random_lat_rad = center_lat_rad + lat_change_rad * math.sin(random_angle)
    random_lat = math.degrees(random_lat_rad)

    # 计算随机的经度（单位弧度），再转换回角度
    random_lon_rad = center_lon_rad + lon_change_rad * math.cos(random_angle)
    random_lon = math.degrees(random_lon_rad)

    # 使用字符串格式化来限制经纬度的小数位数
    random_lat = round(random_lat, decimal_places)
    random_lon = round(random_lon, decimal_places)

    return random_lat, random_lon


import paramiko
from datetime import datetime


def get_remote_server_time_ssh(ip, username, password):
    """
    通过SSH连接远程服务器并获取服务器时间，将其格式化为指定格式（%Y%m%d%H%M%S）

    参数:
    - ip: 远程服务器的IP地址
    - username: 登录远程服务器使用的用户名
    - password: 登录远程服务器使用的密码

    返回值:
    - 如果获取成功，返回格式化后的服务器时间字符串（格式为%Y%m%d%H%M%S）；若出现异常，返回None
    """
    try:
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(ip, username=username, password=password)
        stdin, stdout, stderr = ssh.exec_command("date")
        raw_server_time = stdout.read().decode().strip()
        # 先将字符串解析为datetime对象，注意这里的格式字符串要和原字符串的格式匹配
        print(raw_server_time)
        dt = datetime.strptime(raw_server_time, "%Y年 %m月 %d日 %A %H:%M:%S %Z") # %Y年 %m月 %d日 %A %H:%M:%S %Z
        # 重新格式化为其他常见格式，比如常用的 "%Y-%m-%d %H:%M:%S" 格式
        new_format_str = dt.strftime("%Y-%m-%d %H:%M:%S")
        print(new_format_str)
        # # 将获取到的时间字符串解析为datetime对象，假设时间格式符合默认的系统格式（如Linux下常见的格式）
        # dt_obj = datetime.strptime(raw_server_time, '%a %b %d %H:%M:%S %Z %Y')
        # # 再将datetime对象格式化为指定格式的字符串
        # server_time = dt_obj.strftime('%Y%m%d%H%M%S')
        ssh.close()
        return new_format_str
    except Exception as e:
        print(f"获取远程服务器时间出错: {e}")
        return None


def get_start_time_from_user():
    """
    从用户输入获取开始时间的函数，格式要求为 'YYYY-MM-DD HH:MM:SS'
    """
    while True:
        try:
            input_time = input("请输入开始时间（格式为 'YYYY-MM-DD HH:MM:SS'）：")
            print(input_time)
            start_time = datetime.strptime(input_time, "%Y-%m-%d %H:%M:%S")
            return start_time
        except ValueError:
            print("输入的时间格式不正确，请重新输入！")


def build_xml(fod_id, ddtm_value, time_value):
    """
    构建指定格式的XML文档，时间相关内容可传入参数动态设置，并添加XML声明

    :param ddtm_value: DDTM元素对应的时间值，格式需符合要求（如示例中的格式）
    :param time_value: TIME元素对应的时间值，格式需符合要求（如示例中的格式）
    :return: 构建好的XML字符串
    """
    xml_declaration = '<?xml version="1.0" encoding="UTF-8"?>'
    root = ET.Element("MSG")
    meta = ET.SubElement(root, "META")
    sndr = ET.SubElement(meta, "SNDR")
    sndr.text = "FOD"
    rcvr = ET.SubElement(meta, "RCVR")
    seqn = ET.SubElement(meta, "SEQN")
    seqn.text = "56208"
    ddtm = ET.SubElement(meta, "DDTM")
    ddtm.text = ddtm_value
    sorc = ET.SubElement(meta, "SORC")
    mgid = ET.SubElement(meta, "MGID")
    mgid.text = "fod_755024616803667969"
    rmid = ET.SubElement(meta, "RMID")
    apot = ET.SubElement(meta, "APOT")
    apot.text = "ZUUU"
    fod = ET.SubElement(root, "FOD")
    id_elem = ET.SubElement(fod, "ID")
    id_elem.text = fod_id
    runwayid = ET.SubElement(fod, "RUNWAYID")
    runwayid.text = "02R/02L"
    deviceid = ET.SubElement(fod, "DEVICEID")
    deviceid.text = "W10"
    lon = ET.SubElement(fod, "LON")
    lon.text = "123.5478904"
    lat = ET.SubElement(fod, "LAT")
    lat.text = "34.6589541"
    x = ET.SubElement(fod, "X")
    x.text = "234.67"
    y = ET.SubElement(fod, "Y")
    y.text = "32.78"
    size = ET.SubElement(fod, "SIZE")
    size.text = "0.5*1.2"
    type_elem = ET.SubElement(fod, "TYPE")
    type_elem.text = "鸟"
    disposal = ET.SubElement(fod, "DISPOSAL")
    disposal.text = "未处置"
    time_elem = ET.SubElement(fod, "TIME")
    time_elem.text = time_value
    tree = ET.ElementTree(root)
    xml_str = ET.tostring(root, encoding="utf-8", method="xml").decode("utf-8")
    full_xml_str = xml_declaration + "\n" + xml_str
    return full_xml_str


def build_bird(
    fod_id: str = "20240228",
    ddtm_value: str = "20240228050618502",
    time_value: str = "20240228051300",
):
    result_xml = build_xml(fod_id, ddtm_value, time_value)
    data = {
        "code": 0,
        "msg": None,
        "data": {
            "bootSuccess": True,
            "bootState": "200",
            "bootStateDesc": None,
            "msg": [result_xml],
        },
    }
    return "ZCZC " + json.dumps(data) + " NNNN"


if __name__ == "__main__":
    # 示例用法
    center_lat = 37.7749  # 示例中心点纬度，比如旧金山的大致纬度
    center_lon = -122.4194  # 示例中心点经度，比如旧金山的大致经度
    start_lat: float = 37.8125056
    start_lon: float = -122.3874432
    radius_km = 10  # 示例半径范围，单位千米

    random_lat, random_lon = generate_random_lat_lon(center_lat, center_lon, radius_km)
    print(generate_random_lat_lon(start_lat, start_lon, radius_km))
    print(f"随机生成的经纬度坐标: ({random_lat}, {random_lon})")

    print(get_remote_server_time_ssh("192.168.227.60", "root", "111111" ))

